package controllers

import (
	"net/http"
	"strconv"
	models "yuanaiproblem/dao/model"
	response "yuanaiproblem/models"
	"yuanaiproblem/models/dto"
	"yuanaiproblem/services"
	"yuanaiproblem/utils"

	"github.com/gin-gonic/gin"
)

// GetUsers 获取用户列表
// 入参：查询参数（用户名、角色、页码、页大小）
// 流程：验证管理员权限 -> 解析并校验查询参数 -> 调用服务层查询用户列表 -> 返回分页结果
func GetUsers(c *gin.Context) {
	currentUser, err := utils.GetCurrentUser(c)
	if err != nil {
		response.Error(c, http.StatusUnauthorized, err.Error())
		return
	}
	// 权限校验（仅管理员可修改其他用户，普通用户只能修改自己）
	if currentUser.Role != models.RoleAdmin {
		response.Error(c, http.StatusForbidden, "无权限修改此用户信息")
		return
	}

	// 解析并验证查询参数
	var params struct {
		Username string `form:"username"` // 用户名模糊搜索
		Role     string `form:"role"`     // 角色筛选
		Page     int    `form:"page" default:"1"`
		PageSize int    `form:"page_size" default:"10"`
	}
	if err := c.ShouldBindQuery(&params); err != nil {
		response.Error(c, http.StatusBadRequest, "参数解析失败: "+err.Error())
		return
	}
	// 调用服务层查询用户列表
	result, err := services.GetUserList(
		params.Username,
		params.Role,
		params.Page,
		params.PageSize,
	)
	if err != nil {
		response.Error(c, http.StatusInternalServerError, "获取用户列表失败: "+err.Error())
		return
	}
	// 返回成功响应
	response.Success(c, result, "获取用户列表成功")
}

// UpdateUser 更新用户信息
// 入参：路径参数（目标用户ID）、请求体（待更新的用户名/密码/角色）
// 流程：获取当前用户信息 -> 解析目标用户ID -> 权限校验 -> 解析请求参数 -> 调用服务更新 -> 返回结果
func UpdateUser(c *gin.Context) {
	// 获取当前登录用户信息
	currentUser, err := utils.GetCurrentUser(c)
	if err != nil {
		response.Error(c, http.StatusBadRequest, err.Error())
		return
	}
	// 解析路径参数中的目标用户ID
	targetUserIDStr := c.Param("id")
	targetUserID, err := strconv.ParseInt(targetUserIDStr, 10, 32)
	if err != nil {
		response.Error(c, http.StatusBadRequest, "目标用户ID格式错误")
		return
	}
	// 权限校验（仅管理员可修改其他用户，普通用户只能修改自己）
	if currentUser.Role != models.RoleAdmin && int64(currentUser.ID) != targetUserID {
		response.Error(c, http.StatusForbidden, "无权限修改此用户信息")
		return
	}
	// 解析并验证请求体参数
	var req dto.UpdateUserRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, http.StatusBadRequest, "参数格式错误: "+err.Error())
		return
	}
	// 调用服务层执行更新
	updatedUser, err := services.UpdateUser(
		currentUser.ID,                       // 当前操作人ID
		int32(targetUserID),                  // 目标用户ID
		currentUser.Role == models.RoleAdmin, // 是否为管理员（用于服务层二次校验）
		req.Username,                         // 新用户名（可为空）
		req.Password,                         // 加密后的新密码（可为空）
		req.Role,                             // 新角色（仅管理员可修改）
	)
	if err != nil {
		utils.HandleUserServiceError(c, err) // 复用统一错误处理
		return
	}
	// 返回成功响应
	response.Success(c, updatedUser, "用户信息已更新")
}

// GetUserRecords 查看个人出题和组卷记录
// 入参：查询参数（记录类型、页码、页大小）
// 流程：获取当前用户 -> 解析查询参数 -> 调用服务层查询记录 -> 返回分页结果
func GetUserRecords(c *gin.Context) {
	// 获取当前登录用户
	currentUser, err := utils.GetCurrentUser(c)
	if err != nil {
		response.Error(c, http.StatusUnauthorized, "获取用户信息失败："+err.Error())
		return
	}
	// 绑定查询数据
	var req dto.GetUserRecordsQuery
	if err := c.ShouldBindQuery(&req); err != nil {
		response.Error(c, http.StatusBadRequest, "参数错误："+err.Error())
		return
	}
	// 默认为查询全部记录
	if req.RecordType == "" {
		req.RecordType = "all"
	}
	// 调用服务层查询记录
	records, total, err := services.GetUserRecords(
		currentUser.ID, // 当前用户ID（仅查询自己的记录）
		req.RecordType,
		req.Page,
		req.PageSize,
	)
	if err != nil {
		response.Error(c, http.StatusInternalServerError, "查询记录失败："+err.Error())
		return
	}
	// 统一格式返回结果
	response.Success(c, gin.H{
		"total":     total,        // 总记录数
		"page":      req.Page,     // 当前页码
		"page_size": req.PageSize, // 页大小
		"records":   records,      // 记录列表（出题/组卷记录）
	}, "查询个人记录成功")
}
